package mapper;
import org.apache.ibatis.annotations.*;
import entity.User;

import java.util.List;

/**
 * 本类用来演示: 用户的一个mapper接口
 *
 * @author: success
 * @date: 2022/10/22 9:32 上午
 */
public interface UserMapper {
    //查询所有的用户的信息 t_user
    @Select("select * from t_user")
    List<User> findAll();

    //根据id进行查询 - 返回的是单个对象
    //如果sql中只有一个参数,可以直接使用#{value}作为一个占位符
    @Select("select * from t_user where id=#{value}")
    User getById(Integer id);

    //保存一个用户
    //参数的名称必须要和实体类user中的属性的名称高度保持一致
    //返回类型int=>插入的个数

    //DML(Data Manipulation Language 数据操作语言 - insert,update,delete)
    //执行完毕之后,都是需要手动commit - 提交事务
    @Insert("insert into t_user(username,password,power) values(#{username},#{password},#{power})")
    int save(User user);

    //根据id删除
    @Delete("delete from t_user where id=#{value}")
    int delById(Integer id);

    //根据id更新
    //update 表 set 列名=新的列值,列名2 = 新的列值2,列名3=新的列值3 where条件;
    //id列一般是允许更新的.
    @Update("update t_user set username=#{username},password=#{password},power=#{power} where id=#{id}")
    int update(User user);

    //拓展补充俩个
    //1. 模糊查询

    //容易产生sql注入的问题
    //@Select("select * from t_user where username like '%${value}%'")
    @Select("select * from t_user where username like concat('%',#{value},'%')")
    List<User> findByLikeUsername(String username);

    //如果mapper接口中的参数存在多个的话
    //解决方案之一: @Param
    //根据username进行查询,并且power=1

    //多条件查询
    //#{参数名}要和@Param("参数名")高度保持一致
    @Select("select * from t_user where username like concat('%',#{username},'%') and power=#{power}")
    List<User> findByLikeUsernameAndPower(@Param("username") String username, @Param("power") Integer power);

    //课堂demo
    //根据用户名去进行精确匹配 - username一定是db中唯一的
    @Select("select * from t_user where username=#{value}")
    User getByUsername(String username);
}